跟之前一樣,今天我們來管理這個資料庫。首先讓我們建立資料庫。打開MongoSH
use contacts
show dbs
我們直接使用一個叫做 contacts 的資料庫,如果這個資料庫並不存在現在的資料庫管理系統裡面,他就會創建新的。但是如果這個資料庫是空的,就會發現,當我打 show dbs
空空如也。
讓我們加入一個 叫做 people 的集合(collections) 和一筆資料:
db.people.insert({"name": "John"})
你會發現插入資料之後這個資料庫就出現了,同時也會看到這個資料庫中有一個集合。MongoDB 就如同前面介紹 NoSQL 資料庫所講的,不同於SQL有嚴謹的架構和規則,你沒告訴MongoDB的,他一樣會想辦法幫你儲存,只要是沒看過的東西,都是先存再說。
MongoDB 總共有三種可以插入資料的方法。第一種使用的就是上面用的 insert
,他可以插入一筆或是多筆資料,所以也可以寫
db.people.insert([{"name": "Amy"}, {"name": "Alex"}, {"name": "Bob"}])
這時候三筆資料會分別放入資料庫。一般來說使用insert 後成功會回傳成功插入的資料個數,但是這裡使用的MongoSH 的行為比較像是 InsertOne 和 InsertMany。
db.people.insertMany([{"name": "Kevin"}, {"name": "Sean"}, {"name": "Cathy"}])
這時候他回傳的會是每一筆資料的 ObjectId
。在 MongoDB 中,預設的情況是每一個文件 (document) 系統都會給她一個獨一無二的數值來做辨識,系統使用的資料格式叫做 BSON (Binary JSON) 更有效率的儲存和歸檔這些資料。要特別注意的事情是,因問他不是一班的數字或是字串,所以在架接一些服務和系統時,務必要用BSON先做處理喔!
也因為 MongoDB 如此自由,所以就很容易不小心讓同一個欄位存入不同資料型態的事件,有時候為了整理和未來資料處理方便,我們也會希望每一筆資料至少要有某些欄位。這時候就會借用 SQL 綱要的概念,去規範每筆要存入的資料,舉例來說,下面我們要建立一個新的資料集 store
,這時候我們就可以定義說我們一定要存入這間店的店名,同時要有這間店開店的年份。使用者可以自己決定要不要放入其他資料,但是最少一定要有這兩個項目。同時這邊也規定了,它們分別的格式和資料型態。當然這裡只有列舉幾個比較常見的指令,在MongoDB的官網上面有完整的資料!
db.createCollection("store", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "start_year"],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
start_year: {
bsonType: "int",
minimum: 1990,
maximum: 2021,
description: "must be an integer in [ 1990, 2021 ] and is required"
}
}
}
}
})
者時候如果插入不符合格式或是不完整的資料,系統就會阻止這筆資料加入資料庫,並顯示錯誤。
如果我們想改動已經存在資料庫的資料,我們可以用 update
,這個指令的前段使用的是昨天我們討論查找 find
的塞選條件,後面我們可以 $set
設定這個找到的文件要更改的值。要特別注意的事情是,不管有幾項滿足這個查找的條件,update都只會找一個來更新。
db.people.update({ name: "Bob" }, {$set:{"happy":false}})
如果我們知道資料庫中有多筆符合條件的資料,又希望每一筆都被更新,就可以在最後加上 {multi: true}
。(或者可以使用 updateMany
)
db.people.update({ name: { $regex: /^a.*/i } }, {$set:{"happy":true}}, {multi:true})
在 MongoDB 很多的指令可以做到的事情都只差在回傳值,例如在更新的時候,如果不是使用 update
而是 findOneAndUpdate
他回傳的就是更新完的整個文檔,而不是只有更新成功的資料。
另外,如果不想要址更新部分的資料,也可以用replace 直接把整個檔案給取代掉。
單筆的資料刪除一樣就是把塞選條件放進去
db.people.remove({ name:'Bob'})
如果要把整個collection 給清空 (沒錯就跟find一樣沒給條件就是全部喔!)
db.store.remove({})
要刪除整個Collection
db.store.drop()
刪除整個資料庫
db.dropDatabase()
在 MongoDB Compass 的介面中,其實可以透過左側的側欄快速建構資料庫 (下面的按鈕) 和資料集合 (側邊的按鈕)。旁邊的垃圾桶可以刪除。
點選上面的 Add data 也可以手打或是匯入資料
把每一筆資料展開也可以編輯資料本身的內容
最後也可以透過右上角的 Validation 建立剛剛 Schema 的要求
這些工具都會適合拿來聊解並寫出正確的資料庫查詢語言。但是當回到系統整合,很多時候,還是得要寫出完整的程式碼阿!